//
//  PointerVC.swift
//  ReviewSwift
//
//  Created by ladystyle100 on 2017/8/23.
//  Copyright © 2017年 WangXQ. All rights reserved.
//

import UIKit

class PointerVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        /** 指针
         *  我理解的指针是一个标记, 代号
         *  单指针: 比如某片海域, 我们就叫它‘太平洋’, 这个‘太平洋’就相当于一个指针, 每当有人说道‘太平洋’时, 你就知道是那一块地方(内存)
         *  多指针: 当然, 可能还有一些地方叫的名称不一样, ‘老王洋?’, ‘德玛西亚洋?’, ‘诺克萨斯洋?’.... 虽然名字不一样, 但地方(内存)是一样的
         */
        
        /** 指针 (基础属性, Int, Float等等...)
         *  struct, String, Array, Dictionary, Set, 元组tuple, 基础属性, 都是copy
         *  OC对象则是指向, 除非实现NSCopying协议(写这个copying协议就是自己创一个对象, 然后拿自身的值来给新对象)
         *  如果struct, Array, Dictionary.... 里面有OC对象, 则里面的OC对象不会拷贝, 会指向
         *  总结: 在我看来, struct, Array... 这些就像一个模具, 然后里面装着各种 值 and 指针, 值(基础属性)就会直接拷贝, 指针则也算拷贝, 但你拷贝的只是一个指针, 最终, 这个指针的值改变, 所以你的值也会改变
         *
         *  if let a = b {}, 指向, a指向b
         *  函数参数默认是let, 指向, 在函数内不能改变参数值
         *  如果想函数内改变参数, 则需要用UnsafeMutablePointer, 传一个指针进去
         */
        
        /** 使用指针
         // 分配内存
         let pointer = UnsafeMutablePointer<Type>.allocate(capacity: 1 有点不明白这个, 内存容量?)
         // 给指针赋值
         pointer.initialize(to: a)
         // 然后把指针当参数传到函数里面
         pointer.pointee
         // 用完记得deallocate
         pointer.deallocate(capacity: 1)
         */
        
        // 当然, 也可以这样
        var a = Test()
        print(a.a)
        self.receive(pointer: &a)
        print(a.a)
        
    }
    
    /** 改变指针指向的值 */
    func receive(pointer: UnsafeMutablePointer<Test>) {
        pointer.pointee.a = 10
    }
    
}


class Test: NSObject {
    var a = 1
}













